{
d->arch.vgic.dbase = gicv3.dbase;
d->arch.vgic.dbase_size = gicv3.dbase_size;
+
+ d->arch.vgic.rdist_stride = gicv3.rdist_stride;
+ /*
+ * If the stride is not set, the default stride for GICv3 is 2 * 64K:
+ * - first 64k page for Control and Physical LPIs
+ * - second 64k page for Control and Generation of SGIs
+ */
+ if ( !d->arch.vgic.rdist_stride )
+ d->arch.vgic.rdist_stride = 2 * SZ_64K;
+
for ( i = 0; i < gicv3.rdist_count; i++ )
{
d->arch.vgic.rbase[i] = gicv3.rdist_regions[i].base;
d->arch.vgic.rbase_size[i] = gicv3.rdist_regions[i].size;
}
- d->arch.vgic.rdist_stride = gicv3.rdist_stride;
d->arch.vgic.rdist_count = gicv3.rdist_count;
}
else
perfc_incr(vgicr_reads);
- if ( v->domain->arch.vgic.rdist_stride != 0 )
- offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1);
- else
- /* If stride is not set. Default 128K */
- offset = info->gpa & (SZ_128K - 1);
+ offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1);
if ( offset < SZ_64K )
return __vgic_v3_rdistr_rd_mmio_read(v, info, offset);
perfc_incr(vgicr_writes);
- if ( v->domain->arch.vgic.rdist_stride != 0 )
- offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1);
- else
- /* If stride is not set. Default 128K */
- offset = info->gpa & (SZ_128K - 1);
+ offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1);
if ( offset < SZ_64K )
return __vgic_v3_rdistr_rd_mmio_write(v, info, offset);